from django.utils.decorators import method_decorator
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import ModelViewSet

from ERP_5.utils.base_views import MultipleDestroyMixin
from ERP_5.utils.paginations import GlobalPagination
from erp_system.models import DeptModel
from erp_system.serializers.dept_serializer import DeptSerializer

# 定义好了一个swagger的参数
pid_param = openapi.Parameter(name='pid', in_=openapi.IN_QUERY, description='父部门的ID', required=False,
                              type=openapi.TYPE_INTEGER)


@method_decorator(name='list', decorator=swagger_auto_schema(
    manual_parameters=[pid_param],
    operation_description="查询部门的树形结构数据, pid=0或者不传pid表示查询顶级机构的树。")
                  )
class DeptViewSet(ModelViewSet, MultipleDestroyMixin):
    """
    create:
    部门机构--新增

    部门机构新增, status: 201(成功), return: 新增部门机构信息

    destroy:
    部门机构--删除

    部门机构删除, status: 204(成功), return: None

    multiple_delete:
    部门机构--批量删除,必传参数：ids=[1,2,3,4...]

    部门机构批量删除, status: 204(成功), return: None

    update:
    部门机构--修改,不能修改部门机构，只是修改部门机构名字。

    部门机构修改, status: 200(成功), return: 修改后的部门机构信息

    partial_update:
    部门机构--局部修改(部门机构批量授权),只能真的某一个部门机构一次性授权，之前的的授权会被覆盖

    部门机构批量授权, status: 200(成功), return: 修改后的部门机构信息

    list:
    部门机构--获取列表, 如果传参pid=0或者pid不传，则查询所有顶级部门列表， 如果传参pid=具体的值，则查询某个父部门下的所有子部门

    部门机构列表信息, status: 200(成功), return: 部门机构信息列表

    retrieve:
    查询某一个部门机构

    查询指定ID的部门机构, status: 200(成功), return: 用户部门机构
    """

    def get_queryset(self):
        if self.action == 'list':
            q = self.request.query_params.get('pid', None)
            if q:  # 参数中有pid
                pid = int(q)
                if pid == 0:
                    return DeptModel.objects.filter(parent__isnull=True).all()
                else:
                    return DeptModel.objects.filter(parent__id=pid).all()
            else:
                return DeptModel.objects.filter(parent__isnull=True).all()
        else:
            return DeptModel.objects.all()

    queryset = DeptModel.objects.all()
    serializer_class = DeptSerializer
    pagination_class = GlobalPagination

    # permission_classes = [IsAuthenticated]

    # @swagger_auto_schema(method='GET', manual_parameters=[pid_param])
    # @action(methods=['GET'], detail=False)
    # def find(self, request, *args, **kwargs):
    #     return super(DeptViewSet, self).list(request, *args, **kwargs)
